package auxiliadormatricula.logica;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.util.Log;
import auxiliadormatricula.persistencia.DBAdapter;

public enum NoDisciplina {
	
	PROGRAMACAO1("Prog 1", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA), 
	LABPROG1("LP 1", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA), 
	IC("IC", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA),
	CALCULO1("Calc 1", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA),
	VETORIAL("Vetorial", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA),
	LPT("LPT", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA),
	PROGRAMACAO2("Prog 2", new NoDisciplina[]{PROGRAMACAO1, LABPROG1, IC}, StatusDisciplina.NAOCURSADA),
	LABPROG2("LP 2", new NoDisciplina[]{PROGRAMACAO1, LABPROG1, IC}, StatusDisciplina.NAOCURSADA),
	GRAFOS("Grafos", new NoDisciplina[]{PROGRAMACAO1, LABPROG1}, StatusDisciplina.NAOCURSADA),
	CALCULO2("Calc 2", new NoDisciplina[]{CALCULO1}, StatusDisciplina.NAOCURSADA),
	DISCRETA("Discreta", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA),
	FISICACLASSICA("FFC", new NoDisciplina[]{CALCULO1, VETORIAL}, StatusDisciplina.NAOCURSADA),
	EDA("EDA", new NoDisciplina[]{PROGRAMACAO2, LABPROG2, GRAFOS}, StatusDisciplina.NAOCURSADA),
	LEDA("LEDA", new NoDisciplina[]{PROGRAMACAO2, LABPROG2, GRAFOS}, StatusDisciplina.NAOCURSADA),
	LINEAR("Linear", new NoDisciplina[]{VETORIAL}, StatusDisciplina.NAOCURSADA),
	PROB("PROB", new NoDisciplina[]{CALCULO2}, StatusDisciplina.NAOCURSADA),
	TEORIA("Teoria C.", new NoDisciplina[]{GRAFOS, IC, DISCRETA}, StatusDisciplina.NAOCURSADA),
	FISICAMODERNA("FFM", new NoDisciplina[]{CALCULO2, FISICACLASSICA}, StatusDisciplina.NAOCURSADA),
	GI("GI", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA),
	OAC("OAC", new NoDisciplina[]{EDA, LEDA, FISICAMODERNA}, StatusDisciplina.NAOCURSADA),
	LOAC("LOAC", new NoDisciplina[]{EDA, LEDA, FISICAMODERNA}, StatusDisciplina.NAOCURSADA),
	PLP("PLP", new NoDisciplina[]{EDA, LEDA, TEORIA}, StatusDisciplina.NAOCURSADA),
	METODOS("Metodos", new NoDisciplina[]{LINEAR, PROB}, StatusDisciplina.NAOCURSADA),
	METODOLOGIA("Met. Cient.", new NoDisciplina[]{METODOS}, StatusDisciplina.NAOCURSADA),
	LOGICA("Logica", new NoDisciplina[]{TEORIA}, StatusDisciplina.NAOCURSADA),
	SI1("SI1", new NoDisciplina[]{GI}, StatusDisciplina.NAOCURSADA),
	ENGENHARIA("ES", new NoDisciplina[]{PROGRAMACAO2, LABPROG2, PROB}, StatusDisciplina.NAOCURSADA),
	ATALGORITMOS("ATAL", new NoDisciplina[]{EDA, LEDA, CALCULO2, LOGICA}, StatusDisciplina.NAOCURSADA),
	REDES("Redes", new NoDisciplina[]{OAC, LOAC}, StatusDisciplina.NAOCURSADA),
	COMPILADORES("Compil.", new NoDisciplina[]{OAC, LOAC, PLP}, StatusDisciplina.NAOCURSADA),
	BDADOS1("BD 1", new NoDisciplina[]{SI1}, StatusDisciplina.NAOCURSADA),
	SI2("SI 2", new NoDisciplina[]{SI1}, StatusDisciplina.NAOCURSADA),
	LES("LES", new NoDisciplina[]{ENGENHARIA}, StatusDisciplina.NAOCURSADA),
	INFOSOC("INFOSOC", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA),
	SOPERACIONAIS("SO", new NoDisciplina[]{OAC, LOAC}, StatusDisciplina.NAOCURSADA),
	IRC("IRC", new NoDisciplina[]{REDES}, StatusDisciplina.NAOCURSADA),
	LIRC("LIRC", new NoDisciplina[]{REDES}, StatusDisciplina.NAOCURSADA),
	IARTIFICIAL("IA", new NoDisciplina[]{ATALGORITMOS, PLP, METODOS}, StatusDisciplina.NAOCURSADA),
	BDADOS2("BD 2", new NoDisciplina[]{BDADOS1, SI2}, StatusDisciplina.NAOCURSADA),
	REDESNEURAIS("Redes Neur.", new NoDisciplina[]{ATALGORITMOS, LINEAR}, StatusDisciplina.NAOCURSADA),
	METODOSFORMAIS("Met. Form.", new NoDisciplina[]{ENGENHARIA}, StatusDisciplina.NAOCURSADA),
	DIREITO("Dir. e Cid.", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA),
	MSN("MSN", new NoDisciplina[]{ATALGORITMOS, LINEAR}, StatusDisciplina.NAOCURSADA),
	ADSD("ADSD", new NoDisciplina[]{PROB}, StatusDisciplina.NAOCURSADA),
	RELACOESHUMANAS("Rel. Hum.", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA),
	PROJETO1("Projeto 1", new NoDisciplina[]{LES, METODOLOGIA}, StatusDisciplina.NAOCURSADA),
	PROJETO2("Projeto 2", new NoDisciplina[]{PROJETO1}, StatusDisciplina.NAOCURSADA),
	OPT4("Optv. 4", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA), 
	OPT5("Optv. 5", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA), 
	OPT6("Optv. 6", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA), 
	OPT7("Optv. 7", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA), 
	OPT8("Optv. 8", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA), 
	OPT9("Optv. 9", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA), 
	OPT10("Optv. 10", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA), 
	OPT11("Optv. 11", new NoDisciplina[]{}, StatusDisciplina.NAOCURSADA);
	
	private String nome;
	private NoDisciplina[] dependencias;
	private StatusDisciplina status;
	
	private NoDisciplina(String nome, NoDisciplina[] dependencias, StatusDisciplina status) {
		this.nome = nome;
		this.dependencias = dependencias;
		this.status = status;
	}
	

	public String getNome() {
		return nome;
	}
	
	public NoDisciplina[] getDependencias() {
		return dependencias;
	}
	
	public void setDependencias(NoDisciplina[] dependencias) {
		this.dependencias = dependencias;
	}
	
	public String[] getDependenciasTexto() {
		String[] nomes = new String[dependencias.length];
		for(int i = 0; i < dependencias.length; i++)
			nomes[i]=dependencias[i].getNome();
		return nomes;
	}
	
	public String getStatusTexto() {
		return status.getTexto();
	}
	
	public StatusDisciplina getStatus() {
		return status; 
	}
	
	public void setStatus(StatusDisciplina novoStatus) {
		this.status = novoStatus;
	}
	
	public boolean disponivel() {
		for(NoDisciplina nd : dependencias)
			if(nd.getStatus()!=StatusDisciplina.CURSADA)
				return false;
		return true;
	}
	
	public List<NoDisciplina> posRequisitos() {
		List<NoDisciplina> lista = new ArrayList<NoDisciplina>();
		for(NoDisciplina nd : NoDisciplina.values()) {
			Log.w("!!)", String.format("%s", getNome()));
			for(int i = 0; i < nd.dependencias.length; i++)  {
				if(nd.dependencias[i].getNome().equals(this.getNome())) {
					Log.w("!!", String.format("%s", nd.dependencias[i].getNome()));
					lista.add(nd);
					break;
				}
			}
		}
		return lista;
	}
	
	
	public void atualizar(Context ctx) {
		for(NoDisciplina nd : posRequisitos()) {
			if(nd.status != StatusDisciplina.NAOCURSADA) {
				if(disponivel()) {
					nd.setStatus(StatusDisciplina.NAOCURSADA);
					Log.w("!!", String.format("%s", nd.getNome()));
				}
				DBAdapter dataSoucer = new DBAdapter(ctx);
				dataSoucer.open();
				dataSoucer.atualizarDisc(nd);
				dataSoucer.close();
				nd.atualizar(ctx);
			}
		}
	}
	
	

}